/*
 Data plugin for Highcharts
 
 (c) 2012-2013 Torstein Hønsi
 Last revision 2013-06-07
 
 License: www.highcharts.com/license
 */
(function(h) {
    var k = h.each, m = function(b, a) {
        this.init(b, a)
    };
    h.extend(m.prototype, {init: function(b, a) {
            this.options = b;
            this.chartOptions = a;
            this.columns = b.columns || this.rowsToColumns(b.rows) || [];
            this.columns.length ? this.dataFound() : (this.parseCSV(), this.parseTable(), this.parseGoogleSpreadsheet())
        }, getColumnDistribution: function() {
            var b = this.chartOptions, a = b && b.chart && b.chart.type, c = [];
            k(b && b.series || [], function(b) {
                c.push((h.seriesTypes[b.type || a || "line"].prototype.pointArrayMap || [0]).length)
            });
            this.valueCount =
                    {global: (h.seriesTypes[a || "line"].prototype.pointArrayMap || [0]).length, individual: c}
        }, dataFound: function() {
            this.parseTypes();
            this.findHeaderRow();
            this.parsed();
            this.complete()
        }, parseCSV: function() {
            var b = this, a = this.options, c = a.csv, d = this.columns, f = a.startRow || 0, i = a.endRow || Number.MAX_VALUE, j = a.startColumn || 0, e = a.endColumn || Number.MAX_VALUE, g = 0;
            c && (c = c.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split(a.lineDelimiter || "\n"), k(c, function(c, h) {
                var n = b.trim(c), p = n.indexOf("#") === 0;
                h >= f && h <= i && !p && n !== "" &&
                        (n = c.split(a.itemDelimiter || ","), k(n, function(b, a) {
                            a >= j && a <= e && (d[a - j] || (d[a - j] = []), d[a - j][g] = b)
                        }), g += 1)
            }), this.dataFound())
        }, parseTable: function() {
            var b = this.options, a = b.table, c = this.columns, d = b.startRow || 0, f = b.endRow || Number.MAX_VALUE, i = b.startColumn || 0, j = b.endColumn || Number.MAX_VALUE, e;
            a && (typeof a === "string" && (a = document.getElementById(a)), k(a.getElementsByTagName("tr"), function(a, b) {
                e = 0;
                b >= d && b <= f && k(a.childNodes, function(a) {
                    if ((a.tagName === "TD" || a.tagName === "TH") && e >= i && e <= j)
                        c[e] || (c[e] = []),
                                c[e][b - d] = a.innerHTML, e += 1
                })
            }), this.dataFound())
        }, parseGoogleSpreadsheet: function() {
            var b = this, a = this.options, c = a.googleSpreadsheetKey, d = this.columns, f = a.startRow || 0, i = a.endRow || Number.MAX_VALUE, j = a.startColumn || 0, e = a.endColumn || Number.MAX_VALUE, g, h;
            c && jQuery.getJSON("https://spreadsheets.google.com/feeds/cells/" + c + "/" + (a.googleSpreadsheetWorksheet || "od6") + "/public/values?alt=json-in-script&callback=?", function(a) {
                var a = a.feed.entry, c, k = a.length, m = 0, o = 0, l;
                for (l = 0; l < k; l++)
                    c = a[l], m = Math.max(m, c.gs$cell.col),
                            o = Math.max(o, c.gs$cell.row);
                for (l = 0; l < m; l++)
                    if (l >= j && l <= e)
                        d[l - j] = [], d[l - j].length = Math.min(o, i - f);
                for (l = 0; l < k; l++)
                    if (c = a[l], g = c.gs$cell.row - 1, h = c.gs$cell.col - 1, h >= j && h <= e && g >= f && g <= i)
                        d[h - j][g - f] = c.content.$t;
                b.dataFound()
            })
        }, findHeaderRow: function() {
            k(this.columns, function() {
            });
            this.headerRow = 0
        }, trim: function(b) {
            return typeof b === "string" ? b.replace(/^\s+|\s+$/g, "") : b
        }, parseTypes: function() {
            for (var b = this.columns, a = b.length, c, d, f, i; a--; )
                for (c = b[a].length; c--; )
                    d = b[a][c], f = parseFloat(d), i = this.trim(d),
                            i == f ? (b[a][c] = f, f > 31536E6 ? b[a].isDatetime = !0 : b[a].isNumeric = !0) : (d = this.parseDate(d), a === 0 && typeof d === "number" && !isNaN(d) ? (b[a][c] = d, b[a].isDatetime = !0) : b[a][c] = i === "" ? null : i)
        }, dateFormats: {"YYYY-mm-dd": {regex: "^([0-9]{4})-([0-9]{2})-([0-9]{2})$", parser: function(b) {
                    return Date.UTC(+b[1], b[2] - 1, +b[3])
                }}}, parseDate: function(b) {
            var a = this.options.parseDate, c, d, f;
            a && (c = a(b));
            if (typeof b === "string")
                for (d in this.dateFormats)
                    a = this.dateFormats[d], (f = b.match(a.regex)) && (c = a.parser(f));
            return c
        }, rowsToColumns: function(b) {
            var a,
                    c, d, f, i;
            if (b) {
                i = [];
                c = b.length;
                for (a = 0; a < c; a++) {
                    f = b[a].length;
                    for (d = 0; d < f; d++)
                        i[d] || (i[d] = []), i[d][a] = b[a][d]
                }
            }
            return i
        }, parsed: function() {
            this.options.parsed && this.options.parsed.call(this, this.columns)
        }, complete: function() {
            var b = this.columns, a, c, d = this.options, f, i, j, e, g, k;
            if (d.complete) {
                this.getColumnDistribution();
                b.length > 1 && (a = b.shift(), this.headerRow === 0 && a.shift(), a.isDatetime ? c = "datetime" : a.isNumeric || (c = "category"));
                for (e = 0; e < b.length; e++)
                    if (this.headerRow === 0)
                        b[e].name = b[e].shift();
                i = [];
                for (e = 0, k = 0; e < b.length; k++) {
                    f = h.pick(this.valueCount.individual[k], this.valueCount.global);
                    j = [];
                    for (g = 0; g < b[e].length; g++)
                        j[g] = [a[g], b[e][g] !== void 0 ? b[e][g] : null], f > 1 && j[g].push(b[e + 1][g] !== void 0 ? b[e + 1][g] : null), f > 2 && j[g].push(b[e + 2][g] !== void 0 ? b[e + 2][g] : null), f > 3 && j[g].push(b[e + 3][g] !== void 0 ? b[e + 3][g] : null), f > 4 && j[g].push(b[e + 4][g] !== void 0 ? b[e + 4][g] : null);
                    i[k] = {name: b[e].name, data: j};
                    e += f
                }
                d.complete({xAxis: {type: c}, series: i})
            }
        }});
    h.Data = m;
    h.data = function(b, a) {
        return new m(b, a)
    };
    h.wrap(h.Chart.prototype,
            "init", function(b, a, c) {
                var d = this;
                a && a.data ? h.data(h.extend(a.data, {complete: function(f) {
                        a.series && k(a.series, function(b, c) {
                            a.series[c] = h.merge(b, f.series[c])
                        });
                        a = h.merge(f, a);
                        b.call(d, a, c)
                    }}), a) : b.call(d, a, c)
            })
})(Highcharts);
